﻿using System;
using System.ComponentModel;
using System.Drawing;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace CSharpServerControls
{
    /// <summary>
    /// Definição de como a tag do controlo é apresentada no HTML em desenvolvimento e do icone apresentado na toolbox do visual studio.
    /// </summary>
    [ToolboxData("<{0}:CustomButton runat=server></{0}:CustomButton>")]
    [ToolboxBitmap(typeof(CustomButton), "Imgs.file.ico")]
    public class CustomButton : CompositeControl
    {
        #region Properties
        /// <summary>
        /// Declaração dos controlos a criar e dos eventos a usar.
        /// </summary>
        public event EventHandler Click;
        private LinkButton btnLink;
        private Panel pnl;

        /// <summary>
        /// Propriedade para definir o texto a apresentar no botão.
        /// </summary>
        [Category("CustomProperties")]
        [Description("Texto a apresentar no botão.")]
        public string ButtonText { get; set; }

        /// <summary>
        /// Propriedade para definir o css do botão, usando o Enum possibilita a escolhar por ddl na caixa de propriedades do controlo.
        /// </summary>
        [Category("CustomProperties")]
        [Description("Css a apresentar ao botão.")]
        public ButtonCss ButtonClass { get; set; }
        public enum ButtonCss
        {
            Positive = 0,
            Negative = 1,
            Regular = 2
        }
        #endregion

        #region Methods
        /// <summary>
        /// Método para retornar a class do botão.
        /// </summary>
        /// <returns></returns>
        private string SetCss()
        {
            string CssClass = string.Empty;
            switch ((int)ButtonClass)
            {
                case 0:
                    CssClass = "positive";
                    break;
                case 1:
                    CssClass = "negative";
                    break;
                case 2:
                    CssClass = "regular";
                    break;
                default:
                    CssClass = "regular";
                    break;
            }
            return CssClass;
        }
        #endregion

        #region Events
        /// <summary>
        /// Evento que cria a estrutura a apresentar no controlo.
        /// </summary>
        protected override void CreateChildControls()
        {
            pnl = new Panel();
            btnLink = new LinkButton();
            Controls.Add(pnl);
            pnl.Controls.Add(btnLink);
            pnl.CssClass = "buttons";
            btnLink.Text = this.ButtonText;
            btnLink.CssClass = SetCss();
            btnLink.Click += new EventHandler(this.OnBtnLink_Click);
            base.CreateChildControls();
        }

        /// <summary>
        /// Declaração necessaria para o evento de Click ser executado pelo postback.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void OnBtnLink_Click(object sender, EventArgs e)
        {
            if (Click != null)
            {
                Click(this, e);
            }
        }

        /// <summary>
        /// Evento que assegura que o Evento de CreateChildControls é correctamente executado.
        /// </summary>
        /// <param name="e"></param>
        protected override void OnInit(EventArgs e)
        {
            EnsureChildControls();
            base.OnInit(e);
        }

        /// <summary>
        /// Evento para associar webresources ao controlo sejam estilos, scripts ou imagens. Necessitam ser adicionadas ao ficheiro AssemblyInfo.cs e definidas como Embebed Resource nas properties.
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPreRender(EventArgs e)
        {
            if (!DesignMode && Page.Header != null)
            {
                bool linkIncluded = false;
                foreach (Control c in Page.Header.Controls)
                {
                    if (c.ID == "CustomButtonStyle")
                    {
                        linkIncluded = true;
                    }
                }
                if (!linkIncluded)
                {
                    HtmlGenericControl csslink = new HtmlGenericControl("link");
                    csslink.ID = "CustomButtonStyle";
                    csslink.Attributes.Add("href", Page.ClientScript.GetWebResourceUrl(typeof(CustomButton), "CSharpServerControls.Css.Style.css"));
                    csslink.Attributes.Add("type", "text/css");
                    csslink.Attributes.Add("rel", "stylesheet");
                    Page.Header.Controls.Add(csslink);
                }
            }
        }

        /// <summary>
        /// Evento para retirar a tag <span> que é criado automaticamente à volta do controlo quando a pagina é renderizada, para isto usa-se o codigo abaixo indicado.
        /// </summary>
        /// <param name="output"></param>
        protected override void Render(HtmlTextWriter output)
        {
            this.RenderContents(output);
        }
        #endregion
    }
}
